package utilities;

import java.util.Locale;
import java.util.regex.Pattern;
import org.apache.commons.validator.DateValidator;
import org.apache.commons.validator.EmailValidator;
import org.apache.commons.validator.UrlValidator;
import org.apache.commons.validator.routines.FloatValidator;

/**
 *
 * @author Ale
 */
public class Regexp {
    
    /**
     * Verifica che la stringa in input sia un'email valida
     * @param email stringa da verificare
     * @param mandatory se true, la stringa vuota è considerata non valida
     * @return true sse la stringa è valida
     */
    public static boolean checkEmail(String email, boolean mandatory) {
        if (!hasContent(email)) return !mandatory;
        
        return EmailValidator.getInstance().isValid(email);
    }
    
    /**
     * Verifica che la stringa in input sia un url valido
     * @param url stringa da verificare
     * @param mandatory se true, la stringa vuota è considerata non valida
     * @return true sse la stringa è valida
     */
    public static boolean checkURL(String url, boolean mandatory) {
        if (!hasContent(url)) return !mandatory;
        
        UrlValidator uv = new UrlValidator();
        
        if (url.startsWith("http://") || url.startsWith("https://"))
            return uv.isValid(url);
        else              
            return uv.isValid("http://" + url);
    }
    
    /**
     * Verifica che la stringa in input sia una password valida
     * @param password stringa da verificare
     * @param mandatory se true, la stringa vuota è considerata non valida
     * @return true sse la stringa è valida
     */
    public static boolean checkPassword(String password, boolean mandatory) {
        if (!hasContent(password)) return !mandatory;
        
        return (password.length() >= 8) && (password.length() <= 32);
    }
    
    /**
     * Verifica che le due password in input coincidano
     * @param password1 la prima password
     * @param password2 la seconda password
     * @param mandatory se true, la stringa vuota in una o entrambre le password è considerata non valida
     * @return true sse le due password coincidono
     */
    public static boolean checkPasswordCoincidence(String password1, String password2, boolean mandatory) {
        if (mandatory && (!hasContent(password1) || !hasContent(password2)))
            return false;
        
        return password1.equals(password2);
    }
    
    /**
     * Verifica che la stringa in input sia alfanumerica
     * @param s stringa da verificare
     * @param mandatory se true, la stringa vuota è considerata non valida
     * @return true sse la stringa è valida
     */
    public static boolean checkAlphanumeric(String s, boolean mandatory) {
        if (!hasContent(s)) return !mandatory;
        
        return checkRegex(s, "[A-Za-zÀÈÉÌÒÙàèéìòù,\\s\\d]+");
    }

    /**
     * Verifica che la stringa in input sia alfabetica
     * @param s stringa da verificare
     * @param mandatory se true, la stringa vuota è considerata non valida
     * @return true sse la stringa è valida
     */
    public static boolean checkAlphabetic(String s, boolean mandatory) {
        if (!hasContent(s)) return !mandatory;
        
        return checkRegex(s, "[A-Za-zÀÈÉÌÒÙàèéìòù,\\s]+");
    }

    /**
     * Verifica che la stringa in input sia una data valida
     * @param date stringa da verificare
     * @param mandatory se true, la stringa vuota è considerata non valida
     * @return true sse la stringa è valida
     */
    public static boolean checkDate(String date, boolean mandatory){
        if (!hasContent(date)) return !mandatory;
        
        return DateValidator.getInstance().isValid(date, "dd-MM-yyyy", false);
    }
    
    /**
     * Verifica che la stringa in input sia una valuta valida
     * @param s stringa da verificare
     * @param mandatory se true, la stringa vuota è considerata non valida
     * @return true sse la stringa è valida
     */
    public static boolean checkMoney(String s, boolean mandatory) {
        if (!hasContent(s)) return !mandatory;
        
        return FloatValidator.getInstance().isValid(s, Locale.ITALIAN);
    }
    
    private static boolean checkRegex(String s, String regex) {
        return Pattern.compile(regex).matcher(s).matches();
    }
    
    /**
     * Verifica che la stringa in input non sia vuota
     * @param s la string da verificare
     * @return true sse la stringa non è vuota
     */
    public static boolean hasContent(String s) {
        return (s != null) && !(s.trim().equals(""));
    }
            
}
